在爬蟲時往往會需要等待頁面加載完成後才可以正確的讀到想要尋找的元素,而Selenium裡就有提供幾種等待元素的方式,讓我們一起來看看。
Selenium等待的方法有以下幾種:
driver.implicitly_wait()
方法設置等待時間,單位為秒。from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10) # seconds
myElement = driver.find_element_by_id("someId")
until()
換成until_not()
就是當條件不符合時。WebDriverWait(driver, 等待的最長時間, 檢查條件的頻率, 忽略的例外類別).until(expected_conditions條件, 超時例外的錯誤訊息)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
time.sleep()
在設置的秒數后繼續執行。import time
time.sleep(5) # seconds
myElement = driver.find_element_by_id("someId")
所以總結來說,建議使用隱式等待來設置全局等待時間,並在需要等待特定條件時,使用顯式等待。避免使用sleep()
方法因為它會影響測試執行效率。
在上面提到了使用expected_conditions來尋找特定條件是否符合而Selenium中的expected_conditions類提供了多種可用條件,常見的有:
title_is
- 頁面title符合預期title_contains
- 頁面title包含預期文字presence_of_element_located
- 元素出現在DOM中visibility_of_element_located
- 元素可見element_to_be_clickable
- 元素可點擊element_to_be_selected
- 元素被選中alert_is_present
- 警告框出現些外還有:
text_to_be_present_in_element
- 元素包含預期文字invisibility_of_element_located
- 元素不可見element_to_be_selected
- 元素被選中staleness_of
- 元素不在DOM或不可見使用範例:
wait.until(EC.title_is("Expected Title"))
wait.until(EC.element_to_be_clickable((By.ID, 'submit')))
所以expected_conditions提供了很多種條件選擇,可以根據實際需要構建顯式等待。